﻿Public Class ucNFCadastro
#Region "Eventos públicos acessados pelo formulário de cadastro"
    Public Event Salvo()
    Public Event Cancelado()
#End Region

#Region "NF"
    ''' <summary>
    ''' A camada control é responsável pela criação da nova entidade
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Novo()
        Dim Nf As Model.Nf
        Dim NfControl As New Control.Nf

        Nf = NfControl.Novo()

        bsNF.DataSource = Nf

        LoadReferences()
        StatusForm(True)
    End Sub

    ''' <summary>
    ''' Carrega para visualização a entidade apartir do id
    ''' </summary>
    ''' <param name="entity">Entidade simplificada para que apartir do id
    '''  sejá carregado a entidade completa</param>
    ''' <remarks></remarks>
    Public Sub Visualiza(ByVal entity As Model.NfPesquisa)
        StatusForm(False)

        Dim ctrlNF As New Control.Nf
        bsNF.DataSource = ctrlNF.GetById(entity.cd_nf)

        LoadReferences()
    End Sub

    ''' <summary>
    ''' Carrega os relacionamentos da entidade principal NF
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub LoadReferences()

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' NF
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim Nf As Model.Nf
        Nf = CType(bsNF.Current, Model.Nf)

        Using CFOP As New Control.Cfop
            bsCFOP.DataSource = CFOP.ListaTudo()
        End Using
        If Nf.Cfop IsNot Nothing Then
            cbCFOP.SelectedValue = Nf.Cfop.cd_cfop
        Else
            cbCFOP.SelectedValue = 0
            cbCFOP.SelectedItem = Nothing
        End If

        ' Estado e municipios do estado
        Using Estado As New Control.Estado
            bsEstado.DataSource = Estado.ListaTudo()
        End Using
        If Nf.Estado IsNot Nothing Then
            cbEstado.SelectedValue = Nf.Estado.cd_estado

            Using Municipio As New Control.Municipio
                cbMunicipio.DataSource = Municipio.GetByEstado(Nf.Estado)
            End Using
            If Nf.Municipio IsNot Nothing Then
                cbMunicipio.SelectedValue = Nf.Municipio.cd_municipio
            Else
                cbMunicipio.SelectedValue = 0
                cbMunicipio.SelectedItem = Nothing
            End If
        Else
            cbEstado.SelectedValue = 0
            cbEstado.SelectedItem = Nothing
        End If

        Using Cliente As New Control.Cliente
            bsCliente.DataSource = Cliente.ListaTudo()
        End Using
        If Nf.PessoaCliente IsNot Nothing Then
            cbCliente.SelectedValue = Nf.PessoaCliente.cd_pessoa
        Else
            cbCliente.SelectedValue = 0
            cbCliente.SelectedItem = Nothing
        End If

        ' Tipo Documento
        cbTipoDocumento.DataSource = Model.Enum(Of Model.TipoDocumento).Descriptions()
        If Nf.nf_tipo_documento > 0 Then
            cbTipoDocumento.SelectedIndex = Nf.nf_tipo_documento
        Else
            cbTipoDocumento.SelectedIndex = 0
        End If

        ' Tipo Impressão DANFE
        cbTipoImpressao.DataSource = Model.Enum(Of Model.TipoImpDanfe).Descriptions()
        If Nf.nf_tipo_imp_danfe > 0 Then
            cbTipoImpressao.SelectedIndex = Nf.nf_tipo_imp_danfe
        Else
            cbTipoImpressao.SelectedIndex = 0
        End If

        ' Forma de pagamento
        cbFormaPagamento.DataSource = Model.Enum(Of Model.FormaPagamento).Descriptions()
        If Nf.nf_forma_pagamento > 0 Then
            cbFormaPagamento.SelectedIndex = Nf.nf_forma_pagamento
        End If

        ' Forma Emissao
        cbFormaEmissao.DataSource = Model.Enum(Of Model.FormaEmissao).Descriptions()
        If Nf.nf_forma_emissao > 0 Then
            cbFormaEmissao.SelectedIndex = Nf.nf_forma_emissao
        End If

        ' Finalidade
        cbFinalidadeEmissao.DataSource = Model.Enum(Of Model.Finalidade).Descriptions()
        If Nf.nf_finalidade > 0 Then
            cbFinalidadeEmissao.SelectedIndex = Nf.nf_finalidade
        End If

        ' Histórico SEFAZ
        If Nf.Nfretorno IsNot Nothing Then
            bsNfRetorno.DataSource = Nf.Nfretorno
        End If

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'Itens Carrega as referencias para os itens: produtos, unidades, ncms, situac trib...
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Lista dos produtos
        Using Produto As New Control.Produto
            bsProduto.DataSource = Produto.ListaTudo()
        End Using

        ' Situação Tributária ICMS, IPI, PIS e COFINS
        Using SituacTribICMS As New Control.Tr_Situac_Trib
            bsSituacTribICMS.DataSource = SituacTribICMS.GetByTributo(Model.Tr_Situac_Trib.Tributo.ICMS)
        End Using
        Using SituacTribIPI As New Control.Tr_Situac_Trib
            bsSituacTribIPI.DataSource = SituacTribIPI.GetByTributo(Model.Tr_Situac_Trib.Tributo.IPI)
        End Using
        Using SituacTribPIS As New Control.Tr_Situac_Trib
            bsSituacTribPIS.DataSource = SituacTribPIS.GetByTributo(Model.Tr_Situac_Trib.Tributo.PIS)
        End Using
        Using SituacTribCOFINS As New Control.Tr_Situac_Trib
            bsSituacTribCOFINS.DataSource = SituacTribCOFINS.GetByTributo(Model.Tr_Situac_Trib.Tributo.COFINS)
        End Using
        ' Origem ICMS
        Using ICMSOrigem As New Control.Tr_ICMS_Origem
            bsICMSOrigem.DataSource = ICMSOrigem.ListaTudo()
        End Using
        ' Modalidade do ICMS e ICMSST
        Using ModICMS As New Control.Tr_ICMS_Modalidade
            bsModICMS.DataSource = ModICMS.ListaTudo()
        End Using
        Using ModICMSST As New Control.Tr_ICMS_Modalidade
            bsModICMSST.DataSource = ModICMSST.ListaTudo()
        End Using
        ' Outros
        Using NCM As New Control.NCM
            bsNCM.DataSource = NCM.ListaTudo()
        End Using

        Using Unidade As New Control.Unidade
            bsUnidade.DataSource = Unidade.ListaTudo()
        End Using

        ' Itens
        'If CType(bsNF.Current, Model.Nf).Nfitem.Count < 1 Then
        '    Dim Itens As New List(Of Model.Nfitem)
        '    CType(bsNF.Current, Model.Nf).Nfitem = Itens
        'End If
        'bsItem.CancelEdit()
        'bsItem.Clear()
        'bsItem.DataSource = CType(CType(bsNF.Current, Model.Nf).Nfitem, List(Of Model.Nfitem))
        If Nf.Nfitem.Count > 0 Then
            bsItem.DataSource = Nf.Nfitem

            ' Seta as referencias do item atual
            ItemSetReferences(CType(bsItem.Current, Model.Nfitem))
        Else
            Dim Itens As New List(Of Model.Nfitem)
            Nf.Nfitem = Itens
            bsItem.DataSource = Nf.Nfitem
        End If
        'bsItem.DataSource = Nothing
        'bsItem.DataSource = CType(bsNF.Current, Model.Nf).Nfitem

    End Sub

    Private Sub Salvar()

        Dim ctrlNF As New Control.Nf
        Dim nf As Model.Nf

        bsNF.EndEdit()
        bsItem.EndEdit()
        nf = CType(bsNF.Current, Model.Nf)

        If cbCFOP.SelectedIndex > -1 Then
            nf.Cfop = CType(bsCFOP.Current, Model.Cfop)
        Else
            nf.Cfop = Nothing
        End If
        If cbEstado.SelectedIndex > -1 Then
            nf.Estado = CType(bsEstado.Current, Model.Estado)
        Else
            nf.Estado = Nothing
        End If
        If cbMunicipio.SelectedIndex > -1 Then
            nf.Municipio = CType(bsMunicipio.Current, Model.Municipio)
        Else
            nf.Municipio = Nothing
        End If
        If cbCliente.SelectedIndex > -1 Then
            nf.PessoaCliente = CType(bsCliente.Current, Model.Pessoa)
        Else
            nf.PessoaCliente = Nothing
        End If

        ' Tipo Documento
        If cbTipoDocumento.SelectedIndex > 0 Then
            nf.nf_tipo_documento = CType(cbTipoDocumento.SelectedIndex, Short)
        Else
            nf.nf_tipo_documento = 0
        End If
        ' Tipo de impressão Danfe
        If cbTipoImpressao.SelectedIndex > 0 Then
            nf.nf_tipo_imp_danfe = CType(cbTipoImpressao.SelectedIndex, Short)
        Else
            nf.nf_tipo_imp_danfe = 0
        End If
        ' Forma de pagamento
        If cbFormaPagamento.SelectedIndex > 0 Then
            nf.nf_forma_pagamento = CType(cbFormaPagamento.SelectedIndex, Short)
        Else
            nf.nf_forma_pagamento = 0
        End If
        ' Forma Emissão
        If cbFormaEmissao.SelectedIndex > 0 Then
            nf.nf_forma_emissao = CType(cbFormaEmissao.SelectedIndex, Short)
        Else
            nf.nf_forma_emissao = 0
        End If
        ' Finalidade emissao
        If cbFinalidadeEmissao.SelectedIndex > 0 Then
            nf.nf_finalidade = CType(cbFinalidadeEmissao.SelectedIndex, Short)
        Else
            nf.nf_finalidade = 0
        End If

        ctrlNF.Salvar(nf)
        ctrlNF = Nothing


        StatusForm(False)
        RaiseEvent Salvo()
    End Sub

    ''' <summary>
    ''' Carrega os municípios de um estado específico para reduzir a carga de dados
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub CarregaMunicipioEstado()
        Dim Municipio As New Control.Municipio
        If cbEstado.SelectedIndex > -1 Then
            bsMunicipio.DataSource = Municipio.GetByEstado(CType(bsEstado.Current, Model.Estado))
            ' Não tava atualizando o combo, no cad cliente atualiza 
            'sem precisar reatribuir o bsMunicipio ao combo
            cbMunicipio.DataSource = bsMunicipio
        End If
    End Sub

    Private Sub Cancelar()
        ' Faz a treta toda, chama a camada control, cancela...
        bsNF.CancelEdit()
        StatusForm(False)

        ' Avisa o form pricipal que cancelou para retornar a pesquisa
        RaiseEvent Cancelado()
    End Sub

    Private Sub Editar()
        StatusForm(True)
    End Sub

    Private Sub Faturar()
        Dim NF As New Control.Nf

        NF.Faturar(CType(bsNF.Current, Model.Nf))

    End Sub

#End Region

#Region "Item"
    Private Sub ItemIncluir()
        ' Grava uma possível alteração anterior
        bsItem.EndEdit()

        ' Novo
        bsItem.AddNew()

        ' Vincula a nf (porque ta inverse=true na relação nf)
        CType(bsItem.Current, Model.Nfitem).Nf = CType(bsNF.Current, Model.Nf)
    End Sub

    Private Sub ItemExcluir()
        Dim item As Model.Nfitem = CType(bsItem.Current, Model.Nfitem)
        Dim nf As Model.Nf = CType(bsNF.Current, Model.Nf)

        ' Grava uma possível alteração anterior
        bsItem.EndEdit()

        If Dialog.QuestionYesNo("Deseja realmente remover este registro?") = Windows.Forms.DialogResult.Yes And Not bsItem.Current Is Nothing Then
            bsItem.Remove(item)
            bsItem.DataSource = nf.Nfitem
        End If
    End Sub

    ''' <summary>
    ''' Seta os relacionamentos de um item
    ''' Chamado ao selecionar um item na grade de itens
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ItemSetReferences(ByVal Item As Model.Nfitem)

        'Dim Produto As Model.Nfitem
        'Produto = CType(bsItem.Current, Model.Nfitem)

        ' Quando é inclusão o item ainda não existe
        If Item IsNot Nothing Then
            ' Produto
            If Item.Produto IsNot Nothing Then
                cbProduto.SelectedItem = Item.Produto
                cbProduto.SelectedValue = Item.Produto.cd_produto
            Else
                cbProduto.SelectedValue = 0
                cbProduto.SelectedItem = Nothing
            End If

            ' Situação Tributária ICMS, IPI, PIS e COFINS
            If Item.SituacTribICMS IsNot Nothing Then
                cbSituacTribICMS.SelectedValue = Item.SituacTribICMS.cd_tr_situac_trib
            Else
                cbSituacTribICMS.SelectedValue = 0
                cbSituacTribICMS.SelectedItem = Nothing
            End If

            If Item.SituacTribIPI IsNot Nothing Then
                cbSituacTribIPI.SelectedValue = Item.SituacTribIPI.cd_tr_situac_trib
            Else
                cbSituacTribIPI.SelectedValue = 0
                cbSituacTribIPI.SelectedItem = Nothing
            End If

            If Item.SituacTribPIS IsNot Nothing Then
                cbSituacTribPIS.SelectedValue = Item.SituacTribPIS.cd_tr_situac_trib
            Else
                cbSituacTribPIS.SelectedValue = 0
                cbSituacTribPIS.SelectedItem = Nothing
            End If

            If Item.SituacTribCOFINS IsNot Nothing Then
                cbSituacTribCOFINS.SelectedValue = Item.SituacTribCOFINS.cd_tr_situac_trib
            Else
                cbSituacTribCOFINS.SelectedValue = 0
                cbSituacTribCOFINS.SelectedItem = Nothing
            End If

            ' Origem ICMS
            If Item.ICMSOrigem IsNot Nothing Then
                cbICMSOrigem.SelectedValue = Item.ICMSOrigem.cd_tr_icms_origem
            Else
                cbICMSOrigem.SelectedValue = 0
                cbICMSOrigem.SelectedItem = Nothing
            End If

            ' Modalidade do ICMS e ICMSST
            If Item.Mod_ICMS IsNot Nothing Then
                cbModICMS.SelectedValue = Item.Mod_ICMS.cd_tr_icms_mod
            Else
                cbModICMS.SelectedValue = 0
                cbModICMS.SelectedItem = Nothing
            End If

            If Item.Mod_ICMSST IsNot Nothing Then
                cbModICMSST.SelectedValue = Item.Mod_ICMSST.cd_tr_icms_mod
            Else
                cbModICMSST.SelectedValue = 0
                cbModICMSST.SelectedItem = Nothing
            End If

            ' Outros
            If Item.Ncm IsNot Nothing Then
                cbNCM.SelectedValue = Item.Ncm.cd_ncm
            Else
                cbNCM.SelectedValue = 0
                cbNCM.SelectedItem = Nothing
            End If
            If Item.Cfop IsNot Nothing Then
                cbCFOP.SelectedValue = Item.Cfop.cd_cfop
            Else
                cbCFOP.SelectedValue = 0
                cbCFOP.SelectedItem = Nothing
            End If
            If Item.Unidade IsNot Nothing Then
                cbUnidade.SelectedValue = Item.Unidade.cd_unidade
            Else
                cbUnidade.SelectedValue = 0
                cbUnidade.SelectedItem = Nothing
            End If
        End If
    End Sub


    ''' <summary>
    ''' Ao escolher um produto na lista carrega para o item as informações pre-definidas
    ''' Combo leave
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ItemProdutoSet()
        Dim Item As Model.Nfitem

        Item = CType(bsItem.Current, Model.Nfitem)

        If Item IsNot Nothing Then

            Dim Produto As Model.Produto
            Produto = CType(bsProduto.Current, Model.Produto)

            Item.Produto = Produto

            If Produto.Ncm IsNot Nothing Then
                cbNCM.SelectedItem = Produto.Ncm
                cbNCM.SelectedValue = Produto.Ncm.cd_ncm
                Item.Ncm = Produto.Ncm
            Else
                cbNCM.SelectedItem = Nothing
                cbNCM.SelectedValue = 0
            End If

            If Produto.Unidade IsNot Nothing Then
                cbUnidade.SelectedItem = Produto.Unidade
                cbUnidade.SelectedValue = Produto.Unidade.cd_unidade
                Item.Unidade = Produto.Unidade
            Else
                cbUnidade.SelectedItem = Nothing
                cbUnidade.SelectedValue = 0
            End If

        End If
    End Sub

    ''' <summary>
    ''' Atribui o NCM escolhido ao item para gravaçao
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ItemNCMSet()
        Dim Item As Model.Nfitem

        Item = CType(bsItem.Current, Model.Nfitem)

        If Item IsNot Nothing Then
            Dim ncm As Model.Ncm

            ncm = CType(bsNCM.Current, Model.Ncm)
            Item.Ncm = ncm
        End If
    End Sub
    Private Sub ItemCFOPSet()
        Dim item As Model.Nfitem
        item = CType(bsItem.Current, Model.Nfitem)
        If item IsNot Nothing Then
            Dim cfop As Model.Cfop
            cfop = CType(bsCFOP.Current, Model.Cfop)
            item.Cfop = cfop
        End If
    End Sub
    Private Sub ItemUnidadeSet()
        Dim item As Model.Nfitem
        item = CType(bsItem.Current, Model.Nfitem)
        If item IsNot Nothing Then
            Dim unidade As Model.Unidade
            unidade = CType(bsUnidade.Current, Model.Unidade)
            item.Unidade = unidade
        End If
    End Sub
    Private Sub ItemICMSSituacTribSet()
        Dim item As Model.Nfitem
        item = CType(bsItem.Current, Model.Nfitem)
        If item IsNot Nothing Then
            Dim icmsSituacTrib As Model.Tr_Situac_Trib
            icmsSituacTrib = CType(bsSituacTribICMS.Current, Model.Tr_Situac_Trib)
            item.SituacTribICMS = icmsSituacTrib
        End If
    End Sub
#End Region

#Region "Eventos"
    Private Sub StatusForm(ByVal Status As Boolean)
        pnlDados.Enabled = Status
        pnlValores.Enabled = Status

        pnlItemDados.Enabled = Status
        pnlItemICMS.Enabled = Status
        pnlItemIPI.Enabled = Status
        pnlItemPIS.Enabled = Status
        pnlItemCOFINS.Enabled = Status
        pnlItemISSQN.Enabled = Status
        pnlItemII.Enabled = Status
        pnlItemInfAdic.Enabled = Status

        pnlTotalICMS.Enabled = Status
        pnlTotalISSQN.Enabled = Status
        pnlTotalRetencao.Enabled = Status

        btnSalvar.Enabled = Status

        btnEditar.Enabled = Not Status
        btnFaturar.Enabled = Not Status

    End Sub

    Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        Salvar()
    End Sub

    Private Sub bntEditar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEditar.Click
        Editar()
    End Sub

    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        Cancelar()
    End Sub

    Private Sub cbEstado_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbEstado.Leave
        CarregaMunicipioEstado()
    End Sub

    Private Sub btnItemIncluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnItemIncluir.Click
        ItemIncluir()
    End Sub

    Private Sub btnItemRemover_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnItemRemover.Click
        ItemExcluir()
    End Sub

    Private Sub dgvItem_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dgvItem.SelectionChanged
        'ItemLoad()
        ItemSetReferences(CType(bsItem.Current, Model.Nfitem))
    End Sub

    Private Sub cbProduto_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbProduto.Leave
        ItemProdutoSet()
    End Sub

    Private Sub cbNCM_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbNCM.Leave
        ItemNCMSet()
    End Sub

    Private Sub cbItemCFOP_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbItemCFOP.Leave
        ItemCFOPSet()
    End Sub

    Private Sub cbUnidade_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbUnidade.Leave
        ItemUnidadeSet()
    End Sub

    Private Sub cbSituacTribICMS_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbSituacTribICMS.Leave
        ItemICMSSituacTribSet()
    End Sub
#End Region

End Class
